package cn.hchaojie.camp.day05.oop;

/**
 * 测试人民币转大写
 * 
 * @author 16604
 *
 */
public class DemoRmbToCapital {
	private static final long[] TEST_DATA = {
			0,
			1000,
			1001,
			1011,
			1010,
			1234,
			1000_5678L,
			1234_5678_1234L,
		};
	
	public static void main(String[] args) {
		for (long num : TEST_DATA) {
			System.out.println(formatCNY(num));
		}
	}

	public static String formatCNY(long number) {

		// 定义一个新的字符串，用来存放我们的转换字符
		StringBuilder sb = new StringBuilder();

		// 将整数先转换为字符，方便计算
		String num = String.valueOf(number);

		// 这个数组用来存放大写数字
		String[] s = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

		// 这个数组用来存放单位
		String[] s1 = { "圆", "拾", "百", "千", "万", "拾", "百", "千", "亿" };

		// 边界判断
		if (number == 0) {
			return "零元整";
		}
		// 排除负数
		if (number < 0) {
			return "不支持负数转换";
		}

		/**
		 * 用来控制单位,每次向前进一位，就要把单位跟进一位， 注意单位在前，数字在后
		 */
		int inedx = 0;	
		sb.append(s1[inedx++]);
		
		for (int i = 0; i < num.length(); i++) {
			//加入数字
			sb.append(s[(int) (number % 10)]);
			//取整数里面得下一位
			number = (number - number % 10) / 10;
			
			// 如果这点的值为0，就不用加入单位呢
			if ((i + 1) < num.length() && number%10 == 0) {
				inedx++; // 即使整合单位，但是单位还是得前进
				continue;
			}
			
			// 这个if条件主要是为了防止数组越界
			if ((i + 1) < num.length()) {
				sb.append(s1[inedx++]);			//加入单位
			}
		}
			
		// 翻转
		sb.reverse();

		//因为要用到String里面得replaceAll，所有这里要先将StringBuilder转换为String
		String s2 = sb.toString().toLowerCase();
		
		//将里面包含0得全部替换,这里主要处理1001数据，不处理是壹仟零零壹圆
		while(s2.indexOf("零零")!=-1) {
			
			s2 = s2.replaceAll("零零","零");
			
		}
		
		//这里还需要处理一下尾巴,对于100这样的数据，不处理输出是壹佰零圆
		StringBuilder s3 = new StringBuilder(s2);
		if(s3.charAt(s3.length()-2)=='零') {
			s3.deleteCharAt(s3.length()-2);
		}

		return s3.toString().toLowerCase();
	}

}
